package pe.com.sysaut.seguridad.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Repository;

import pe.com.sysaut.dao.impl.GenericDaoImpl;
import pe.com.sysaut.seguridad.bean.GestionarUsuarioBean;
import pe.com.sysaut.seguridad.dao.TusuarioDao;
import pe.com.sysaut.seguridad.domain.Tusuario;
import pe.com.sysaut.util.ConstanteSYSAUT;

@Repository
public class TusuarioDaoImpl extends GenericDaoImpl implements TusuarioDao{

	@Override
	public Tusuario findByUsuarioContrasenia(String usuario, String contrasenia) {
		// TODO Auto-generated method stub
		
		String hql="FROM Tusuario "
				+ "WHERE nomUsuario=? "
				+ "AND contUsuario=? "
				+ "AND indEliminacion=?";
		Object[] values={usuario,contrasenia.getBytes(),ConstanteSYSAUT.DEFAULT_CERO.toString()};
		
		List<Tusuario> lsTusuarios=this.findByHql(hql, values);
		
		if (lsTusuarios!=null){
			if (!lsTusuarios.isEmpty()){
				return lsTusuarios.get(0);
			}
		}
		return null;
	}

	@Override
	public List<GestionarUsuarioBean> findByFiltros(String nombre,
			String usuario) {
		// TODO Auto-generated method stub
		
		String hql="SELECT new pe.com.sysaut.seguridad.bean.GestionarUsuarioBean( "
				+ "usu.idUsuario, "
				+ "persona.nomPersona, "
				+ "persona.apePaterno, "
				+ "persona.apeMaterno, "
				+ "usu.nomUsuario, "
				+ "perfil.nomPerfil, "
				+ "cargo.nomCargo,"
				+ "persona.numDni "
				+ ") "
				+ "FROM Tusuario usu, Tpersona persona, Tperfil perfil, Tcargo cargo "
				+ "WHERE usu.numDni=persona.numDni "
				+ "AND usu.idPerfil=perfil.idPerfil "
				+ "AND usu.idCargo=cargo.idCargo "
				+ "AND usu.indEliminacion=? "
				+ "AND persona.indEliminacion=? ";
		
		List<String> values=new ArrayList<String>();
		
		values.add(ConstanteSYSAUT.DEFAULT_CERO.toString());
		values.add(ConstanteSYSAUT.DEFAULT_CERO.toString());
		
		if (!nombre.equals("")){
			hql+=" AND persona.nomPersona like ? ";
			values.add( "%"+nombre+"%");
		}
		
		if (!usuario.equals("")){
			hql+=" AND usu.nomUsuario like ? ";
			values.add("%"+ usuario+"%");
		}
		
		List<GestionarUsuarioBean> lsGestionarUsuarioBeans;
		
		if (!nombre.equals("") || !usuario.equals("")){
			Object[] objValues=values.toArray();
			lsGestionarUsuarioBeans=this.findByHql(hql, objValues);
		}
		else{
			Object[] objValues=values.toArray();
			lsGestionarUsuarioBeans=this.findByHql(hql,objValues);
		}
		
		if (lsGestionarUsuarioBeans!=null){
			if (!lsGestionarUsuarioBeans.isEmpty()){
				System.out.println(lsGestionarUsuarioBeans.size());
				return lsGestionarUsuarioBeans;
			}
		}
		
		
		return new ArrayList<GestionarUsuarioBean>();
	}

	@Override
	public Integer findNextId(){
		
		String hql="SELECT new Map(max(idUsuario) as maximo) FROM Tusuario ";
		
		List<Object> lsMap=this.findByHql(hql);
		
		
		if (lsMap!=null){
			if (!lsMap.isEmpty()){
				return ((Map<String, Integer>)lsMap.get(0)).get("maximo")+ConstanteSYSAUT.DEFAULT_UNO;
			}
			
		}
			
		return ConstanteSYSAUT.DEFAULT_UNO;
	}
	
	@Override
	public void insertUsuarioo(Tusuario tusuario){
		this.persist(tusuario);
	}
	
	@Override
	public void updateUsuario(Tusuario tusuario){
		this.update(tusuario);
	}
	
	@Override
	public Tusuario findByUsuario(String usuario){
		
		String hql="FROM Tusuario WHERE nomUsuario=? "
				+ "AND indEliminacion=? ";
//		String hql="FROM Tusuario WHERE nomUsuario=? "
//				+ "AND contUsuario=?";
		
		Object[] values={usuario,ConstanteSYSAUT.DEFAULT_CERO.toString()};
		
		List<Tusuario> lsTusuarios=this.findByHql(hql,values);
		
		if (lsTusuarios!=null){
			if (!lsTusuarios.isEmpty()){
				return lsTusuarios.get(0);
			}
		}
				
				
		return null;
	}

	@Override
	public Tusuario findById(Integer id) {
		// TODO Auto-generated method stub
		String hql="FROM Tusuario "
				+ "WHERE idUsuario=? "
				+ "AND indEliminacion=?";
		
		Object[] values={id,ConstanteSYSAUT.DEFAULT_CERO.toString()};
		
		List<Tusuario> lsTusuarios=this.findByHql(hql, values);
		
		if (lsTusuarios!=null){
			if (!lsTusuarios.isEmpty()){
				return lsTusuarios.get(0);
			}
		}
		return null;
		
		
	}
	
}
